/*
 * JsonCast.h
 *
 *  Created on: 2017年3月6日
 *      Author: chuanjiang.zh
 */

#ifndef JSONCAST_H_
#define JSONCAST_H_

#include "BasicType.h"
#include "json/json.h"
#include "TStringCast.h"
#include "DbTypes.h"

class JsonCast
{
public:
	JsonCast();
	virtual ~JsonCast();

    template < class T >
    void toJson(const T& t, Json::Value& value)
    {
        // placehold
    }


	static void toJson(const db::Device& device, Json::Value& value);
	

    template < class Cont >
    static void toList(Cont& cont, std::vector< Json::Value >& values)
    {
        typename Cont::iterator it = cont.begin();
        for (; it != cont.end(); ++ it)
        {
            typename Cont::value_type& v = *it;
            Json::Value element;
            JsonCast::toJson(v, element);
            values.push_back(element);
        }
    }


	template < class Cont >
	static void toArray(Cont& cont, Json::Value& value)
	{
		value = Json::Value(Json::arrayValue);
		typename Cont::iterator it = cont.begin();
		for (; it != cont.end(); ++ it)
		{
			typename Cont::value_type& v = *it;
			Json::Value element;
			JsonCast::toJson(v, element);
			value.append(element);
		}
	}

	template < class Cont >
	static void pointersToArray(Cont& cont, Json::Value& value)
	{
		value = Json::Value(Json::arrayValue);
		typename Cont::iterator it = cont.begin();
		for (; it != cont.end(); ++ it)
		{
			typename Cont::value_type& v = *it;
			Json::Value element;
			JsonCast::toJson(*v, element);
			value.append(element);
		}
	}

	template < class Cont >
	static void basicToArray(const Cont& cont, Json::Value& value)
	{
		value = Json::Value(Json::arrayValue);
		typename Cont::const_iterator it = cont.begin();
		for (; it != cont.end(); ++ it)
		{
			Json::Value element = *it;
			value.append(element);
		}
	}


	template < class T >
	static std::string toString(const T& t)
	{
		Json::Value value;
		toJson(t, value);
		return comn::StringCast::toString(value);
	}

	static bool toFile(const Json::Value& value, const std::string& filepath);

};


#endif /* JSONCAST_H_ */
